import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserProfile, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
export default {
  namespaced: true,
  state: {
    token: getToken(), //  从缓存中读 有就返回这个值 没有就返回null   因为token是一个标识,在某段时间内是一成不变的,所以要做持久化
    // 共享用户基本资料 因为它会被频繁使用
    userInfo: {} // 这里为什么不做持久化(因为用户信息可能被经常改动(改名啊改手机号啊))  为什么不给null 因为 null.username 会报错 而 {}.username=undefined
  },
  // 没有token --> 登录 --> 拿到token --> 设置token
  mutations: {
    setToken(state, token) {
      state.token = token
      setToken(token)
    },
    // 删除缓存
    removeToken(state) {
      state.token = null
      removeToken()
    },
    // 设置用户资料
    setUserInfo(state, userInfo) {
      // 响应式更新对象  浅拷贝
      state.userInfo = userInfo
    },
    // 删除用户资料  其实和设置用户资料可以使用一个 传入的userInfo是空就可以  分开是因为不同业务去调不同的mutation
    removeUserInfo(state) {
      state.userInfo = {}
    }
  },
  actions: {
    // async标识的函数本身返回的就是promise  这里就是说 login()是一个promise对象
    async login(context, data) {
      const result = await login(data) // 实际上就是一个promise  result就是执行的结果   执行完await 一定是登录成功了
      // 提交触发mutation 传入返回值 data里面是用户token
      context.commit('setToken', result)
      // 认为登录成功 设置时间戳
      setTimeStamp() // 将当前最新时间写入缓存
      // }
    },
    // 获取用户信息
    async getUserInfo({ commit }) {
      const result = await getUserProfile() // 这个result就是返回的数据 datz
      const detailResult = await getUserDetailById(result.userId) // 获取用户资料中的头像(其他信息也可以获取到)
      // console.log(detailResult)
      commit('setUserInfo', { ...result, ...detailResult }) // 两个值和到一起 一块更新给userInfo
      return result // 这里return 后面有用
    },
    // 退出登录 删除token 删除用户资料
    logout({ commit }) {
      commit('removeToken')
      commit('removeUserInfo')
      // 重置路由
      resetRouter() // 重置路由\
      // 重置vuex的路由数据
      // vuex中加了命名空间的子模块 怎么调用另外一个子模块的mutations
      commit('permission/setRoutes', [], { root: true })
      // root: true 表示commit 实际上是用顶级的调用方式
    }

  }
}
